package br.com.acme;

import java.util.ArrayList;

/**
 * @author Calebe Arruda
 * @author Roberto Sanmartin
 * @version 1.01
 */
public class AcademicLibrary implements ILibrary {

    private String name;
    private String description;
    private String creationDate;
    private ArrayList<User> users = new ArrayList<>();
    private ArrayList<Publication> publications;
    private short countPublication;
    private short countArticles;
    private short countBooks;

    public AcademicLibrary() {
        publications = new ArrayList<>();
    }

    /**
     * Método para contar os Artigos
     *
     * @return numero de artigos
     */
    public short countArticles() {
        for (Publication publication : publications) {
            if (publication instanceof Article) {
                countArticles++;
            }
        }
        return countArticles;
    }

    /**
     * Metodo para contar os Books
     *
     * @return numero de books
     */
    public short countBooks() {
        for (Publication publication : publications) {
            if (publication instanceof Book) {
                countBooks++;
            }
        }
        return countBooks;
    }

    /**
     * Método para pesquisar um artigo pelo código ISSN
     * @param issn
     * @return 
     */
    public Article findArticle(long issn) {
        for (Publication publication : publications) {
            if (publication instanceof Article) {
                Article article = new Article();
                if (article.getIssn() == issn) {
                    return article;
                }
            }
        }
        return null;
    }
    
    /**
     * Método para pesquisar um artigo pelo Title
     * @param title titulo a ser pesquisado
     * @return objeto do tipo Article
     */
    public Article findArticle(String title){
        for (Publication publication : publications) {
            if (publication instanceof Article) {
                Article article = new Article();
                if (article.getTitle() == title) {
                    return article;
                }
            }
        }
        return null;
    }
    
    /**
     * Método para pesquisar um Book pelo ISBN
     * @param isbn codigo a ser pesquisado
     * @return objeto do tipo Book
     */
    public Book findBook(long isbn){
        for (Publication publication : publications) {
            if (publication instanceof Book) {
                Book book = new Book();
                if (book.getIsbn() == isbn) {
                    return book;
                }
            }
        }
        return null;
    }
    
    /**
     * Método para pesquisar um Book pelo Title
     * @param title nome a ser pesquisado
     * @return objeto do tipo Book
     */
    public Book findBook(String title){
        for (Publication publication : publications) {
            if (publication instanceof Book) {
                Book book = new Book();
                if (book.getTitle() == title) {
                    return book;
                }
            }
        }
        return null;
    }

    /**
     * Método para adicionar uma Publication
     *
     * @param p objeto a ser inserido
     */
    public void addPublication(Publication p) {
        publications.add(p);
    }

    /**
     * Método para excluir uma publication
     *
     * @param id id a ser removido
     * @return true ou false conforme a exclusão
     */
    public boolean removePublication(long id) {
        if (publications.remove(id)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Método para capturar todas as Publications
     *
     * @return lista com as publications
     */
    public ArrayList<Publication> getAllPublications() {
        return publications;
    }

    /**
     * Método para contar o número de Publications
     *
     * @return o valor das Publications
     */
    public short countPublication() {
        for (Publication publication : publications) {
            countPublication++;
        }
        return countPublication;
    }

    /**
     * Método para pesquisar uma Publication pelo titulo
     *
     * @param title
     * @return um objeto Publication
     */
    public Publication findPublication(String title) {
        for (Publication publication : publications) {
            if (publication.getTitle().equals(title)) {
                return publication;
            }
        }
        return null;
    }

    /**
     * Método para pesquisar se tem ou não uma Publication
     *
     * @param title
     * @return
     */
    public boolean hasPublication(String title) {
        for (Publication publication : publications) {
            if (publication.getTitle().equals(title)) {
                return true;
            }
        }
        return false;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the description
     */
    public String getDescription() {
        return description;
    }

    /**
     * @param description the description to set
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @return the creationDate
     */
    public String getCreationDate() {
        return creationDate;
    }

    /**
     * @param creationDate the creationDate to set
     */
    public void setCreationDate(String creationDate) {
        this.creationDate = creationDate;
    }
}
